<!doctype html>
<html lang="zh">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">
  <link rel="icon" href="https://avatars0.githubusercontent.com/u/17268394?s=400&u=5187f48f142aecaa279593ac514211bcca3ec319&v=4">
  <title>protocol analysis</title>
  <!-- Bootstrap core CSS -->
  <link href="../dist/css/bootstrap.min.css" rel="stylesheet">
  <link type="text/css" rel="stylesheet" href="../dist/css/bootstrap-grid.css">
  <link type="text/css" rel="stylesheet" href="../dist/css/bootstrap-reboot.css">
  <link href="../dist/zaddcss/zaddindex.css" rel="stylesheet">
  <style>
    input[name='deviceDataPackage'] {
      width: 90%;
      border-top: none;
      border-left: none;
      border-right: none;
      border-bottom: solid rgb(227, 227, 227);
    }
  </style>
</head>
<body>
<header>
  <div class="collapse bg-dark" id="navbarHeader">
    <div class="container">
      <div class="row">
        <div class="col-sm-8 col-md-7 py-4">
          <h4 class="text-white">About</h4>
          <p class="text-muted">Add some information about the album below.</p>
        </div>
        <div class="col-sm-4 offset-md-1 py-4">
          <h4 class="text-white">Contact</h4>
          <ul class="list-unstyled">
            <li><a href="#" class="text-white">主页</a></li>
            <li><a href="#" class="text-white">关于</a></li>
            <li><a href="#" class="text-white">Email me</a></li>
            <li><a target="_blank" href="https://wpa.qq.com/msgrd?v=3&uin=571928489&site=qq&menu=yes">联系我</a>--></li>
          </ul>
        </div>
      </div>
    </div>
  </div>
  <div class="navbar navbar-dark bg-dark shadow-sm">
    <div class="container d-flex justify-content-between">
      <a href="#" class="navbar-brand d-flex align-items-center">
        <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" aria-hidden="true" class="mr-2" viewBox="0 0 24 24" focusable="false">
          <path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/>
          <circle cx="12" cy="13" r="4"/>
        </svg>
        <strong>Album</strong>
      </a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarHeader" aria-controls="navbarHeader" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
    </div>
  </div>
</header>
<main role="main">
  <section class="jumbotron text-center">
    <div class="container">
      <h3 class="jumbotron-heading">协议分析</h3>
    </div>
  </section>
  <div class="album py-6 bg-light">
    <div class="container">
      <a href="#" class="" id="clearCheckedRadio">清空单选</a>
      <!--是否勾选了兴邦专用-->
      <div class="form-check form-check-inline">
        <input class="form-check-input" style="display:none;" id="hideInlineRadioOptions" type="radio" name="inlineRadioOptions" value="">
        <label class="form-check-label" for="hideInlineRadioOptions"></label>
      </div>
      <!--状态包-->
      <div class="form-check form-check-inline">
        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="pkgStatus" value="option1">
        <label class="form-check-label" for="pkgStatus">状态包</label>
      </div>
      <!--消费记录-->
      <div class="form-check form-check-inline">
        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="pkgCrd" value="option2">
        <label class="form-check-label" for="pkgCrd">消费记录</label>
      </div>
      <!--明飞测试-->
      <div class="form-check form-check-inline">
        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="pkgTestWmg" value="option2">
        <label class="form-check-label" for="pkgTestWmg">明飞测试</label>
      </div>
      <!--预约水控-->
      <div class="form-check form-check-inline">
        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="pkgReserveWater" value="option2">
        <label class="form-check-label" for="pkgReserveWater">预约水控</label>
      </div>
      <!--后期要根据选择器去实现 单选按钮不方便-->
      <div class="form-check">
        <label for="protocol" style="width: 90px">协议:</label>
        <select class="custom-select d-block w-20" id="protocol" required>
          <option value="">请选择协议类型</option>
          <option value="status">状态包</option>
          <option value="reserve-water">上位机下发-微信-预约水控编号-秘钥-预约消费</option>
          <option value="keyboard-water">设备请求-按键-编号-学工号-秘钥-在线消费</option>
        </select>
      </div>
      <!--是否勾选了兴邦专用 end-->
      <!--输入设备码 start -->
      <div class="form-check">
        <label for="deviceDataPackage">设备码：</label>
        <!-- 状态包:00000000000000000000000000000007000000070000000000000202001F03080000000000000000000004D504190327162228000000010000B863 -->
        <input name="deviceDataPackage" id="deviceDataPackage" type="text" value="0000000000000000000000000001D8DF0001D8DF00000000000003030077DF0C00000002010000044000000440015D0064000100010001ADB0000100000000271001FE0031303838000000000000000000000000000000008BFD000000000000000000000000000000000000007885BD6D000000000000000000000000000000000000608211607A636800000000000000B1EC" placeholder=""/>
        <!--输入备码 end -->
        <p id="analysisContext">
        </p>
      </div>
    </div>
  </div>
</main>
<footer class="text-muted" style="margin-top: -10px">
  <div class="container">
    <p class="float-right">
      <a href="#">返回最上</a>
    </p>
    <p>示例页面 &copy; Bootstrap!</p>
    <p>
      <a href="https://github.com/zghnzch">访问我们的主页</a>
    </p>
  </div>
</footer>
<!-- region 引入js文件-->
<script src="../dist/zaddjs/jquery/jquery-3.3.1.min.js"></script>
<script src="../dist/js/bootstrap.min.js"></script>
<script src="../dist/js/bootstrap.bundle.min.js"></script>
<script src="../dist/zaddjs/encrypt/src/core.js"></script>
<script src="../dist/zaddjs/encrypt/src/cipher-core.js"></script>
<script src="../dist/zaddjs/encrypt/src/tripledes.js"></script>
<script src="../dist/zaddjs/encrypt/src/mode-ecb.js"></script>
<script src="../dist/zaddjs/copyContent/copyContent.js"></script>
<!-- endregion 引入js文件-->
<!-- region 元素定义--------------->
<script type="text/javascript">
  let inlineRadioOptions = $('input[name=inlineRadioOptions]');
  let pkgStatus = $('#pkgStatus');
  let pkgReserveWater = $('#pkgReserveWater');
  let pkgCrd = $('#pkgCrd');
  let analysisContext = $('#analysisContext');
  let deviceDataPackage = $('#deviceDataPackage');
  let clearCheckedRadio = $('#clearCheckedRadio');
  // let hideInlineRadioOptions = $('#hideInlineRadioOptions')
</script>
<!-- endregion 元素定义--------------->
<!--$(function () {});-->
<script type="text/javascript">
  $(function () {
    // 内容模式 是否要加密
    pkgStatus.on('change', function () {
      if (checkInputDeviceDataPackage()) {
        setPkgStatus();
      }
      else {
        removeChecked();
      }
    });
    pkgReserveWater.on('change', function () {
      if (checkInputDeviceDataPackage()) {
        setReserveWater();
      }
      else {
        removeChecked();
      }
    });
    pkgCrd.on('change', function () {
      if (checkInputDeviceDataPackage()) {
      }
      else {
        removeChecked();
      }
    });
    deviceDataPackage.on('input', function (e) {
    });
    // 清空单选
    clearCheckedRadio.on('click', function () {
      removeChecked();
    });
    // 监听选择 协议的变换 处理协议数据
    $("#protocol").change(function () {
      let selectedProtocolVal = $(this).children('option:selected').val();
      console.info("selectedProtocolVal:", selectedProtocolVal);
      if (selectedProtocolVal === 'keyboard-water') {

      }
    });
  });
</script>
<!--functions-->
<script type="text/javascript">
  function checkInputDeviceDataPackage() {
    let deviceDataPackageVal = deviceDataPackage.val();
    if (null == deviceDataPackageVal || deviceDataPackageVal.length <= 0) {
      alert('请先填写设备码');
      return false;
    }
    else {
      return true;
    }
  }
  function removeChecked() {
    analysisContext.empty();
    inlineRadioOptions.prop('checked', false);
  }
  function setPkgStatus() {
    // 00000000000000000000000000000007000000070000000000000202001F03080000000000000000000004D504190327162228000000010000B863
    // 00000000000000000000000000000007  32 静态ID（16字节高字节在前）
    // 00000007 40  设备机器号（4字节高字节在前）
    // 00000000 48  从设备机器号（4字节高字节在前；00000000表示主设备；非零表示中转设备）
    // 0000 52 协议类型（2字节高字节在前；0000表示主设备协议；非零表示中转设备协议）
    // 0202 56 设备类型（2字节高字节在前）
    // 001F 60  数据长度（2字节高字节在前）
    // 0308 64  0x03+0x08
    // 00000000 72 随机码（4字节高字节在前，可选）
    // 0000 76 未采集的记录总数（2字节高字节在前）
    // 0000 80 批次的最后名单（2字节高字节在前）
    // 000004D5 88 最后一个曾量挂失名单卡号（4字节高字节在前）
    // 04 90 系统状态信息（1字节；bit 0:黑名单是否已经发送完毕，0不完整； bit 1:终端是否有补助授权，1授权； bit 2: 1，有联机注册权，终端是否有联机注册授权）
    // 190327162228 102 年月日时分秒（6字节；压缩BCD码；例如年0x15表示2015年）（未用）
    // 0000 106 批次个数（2字节，高字节在前）
    // 0001 110 增量个数（2字节，高字节在前）
    // 0000 114 补助版本号（2字节，高字节在前）
    // B863 118 CRC校验（字节高字节在前）
    let deviceDataPackageVal = deviceDataPackage.val();
    let deviceSn = deviceDataPackageVal.substring(0, 32);
    //
    let deviceNum = deviceDataPackageVal.substring(32, 40);
    //
    let subDeviceNum = deviceDataPackageVal.substring(40, 48);
    //
    let protocolType = deviceDataPackageVal.substring(48, 52);
    //
    let deviceType = deviceDataPackageVal.substring(52, 56);
    //
    let length = deviceDataPackageVal.substring(56, 60);
    //
    let mainFrame = deviceDataPackageVal.substring(60, 64);
    //
    let randomCode = deviceDataPackageVal.substring(64, 72);
    //
    let countCrd = deviceDataPackageVal.substring(72, 76);
    //
    let lastBatchCard = deviceDataPackageVal.substring(76, 80);
    //
    let lastBlackCard = deviceDataPackageVal.substring(80, 88);
    // 系统状态信息（1字节；bit 0:黑名单是否已经发送完毕，0不完整； bit 1:终端是否有补助授权，1授权； bit 2: 1，有联机注册权，终端是否有联机注册授权）
    let deviceStatusInfo = deviceDataPackageVal.substring(88, 90);
    //
    let deviceTime = deviceDataPackageVal.substring(90, 102);
    //
    let countBatchBlack = deviceDataPackageVal.substring(102, 106);
    //
    let countIncrementBlack = deviceDataPackageVal.substring(106, 110);
    //
    let subversion = deviceDataPackageVal.substring(110, 114);
    //
    let crc = deviceDataPackageVal.substring(114, 118);
    analysisContext.empty();
    analysisContext.append('<h6>原码:' + deviceDataPackageVal + '</h6>');
    analysisContext.append('<h6>序列号：' + deviceSn + '  十进：' + parseInt(deviceSn, 16) + '</h6>');
    analysisContext.append('<h6>设备号：' + deviceNum + '  十进：' + parseInt(deviceNum, 16) + '</h6>');
    analysisContext.append('<h6>从设备号：' + subDeviceNum + '  十进：' + parseInt(subDeviceNum, 16) + '</h6>');
    analysisContext.append('<h6>协议类型：' + protocolType + '  十进：' + parseInt(protocolType, 16) + '</h6>');
    analysisContext.append('<h6>设备类型：' + deviceType + '  十进：' + parseInt(deviceType, 16) + '</h6>');
    analysisContext.append('<h6>数据长度：' + length + '  十进：' + parseInt(length, 16) + '</h6>');
    analysisContext.append('<h6>关键帧：' + mainFrame + '  十进：' + parseInt(mainFrame, 16) + '</h6>');
    analysisContext.append('<h6>随机码：' + randomCode + '  十进：' + parseInt(randomCode, 16) + '</h6>');
    analysisContext.append('<h6>未采记录：' + countCrd + '  十进：' + parseInt(countCrd, 16) + '</h6>');
    analysisContext.append('<h6>最后批次名单：' + lastBatchCard + '  十进：' + parseInt(lastBatchCard, 16) + '</h6>');
    analysisContext.append('<h6>最后黑名单：' + lastBlackCard + '  十进：' + parseInt(lastBlackCard, 16) + '</h6>');
    analysisContext.append('<h6>设备状态码：' + deviceStatusInfo + '  十进：' + parseInt(deviceStatusInfo, 16) + '</h6>');
    analysisContext.append('<h6>设备时间：' + deviceTime + '  十进：' + parseInt(deviceTime, 16) + '</h6>');
    analysisContext.append('<h6>批次名单个数：' + countBatchBlack + '  十进：' + parseInt(countBatchBlack, 16) + '</h6>');
    analysisContext.append('<h6>黑名单个数：' + countIncrementBlack + '  十进：' + parseInt(countIncrementBlack, 16) + '</h6>');
    analysisContext.append('<h6>补助版本：' + subversion + '  十进：' + parseInt(subversion, 16) + '</h6>');
    // analysisContext.append('<h6>校验：' + crc + '  十进：' + parseInt(crc, 16) + '</h6>')
    // analysisContext.append('<br>')
    analysisContext.append('<h6>校验：' + crc + '  十进：' + parseInt(crc, 16) + '</h6>');
  }
  // 预约水控 编号加密钥
  function setReserveWater() {
    let deviceDataPackageVal = deviceDataPackage.val();
    //
    let deviceSn = deviceDataPackageVal.substring(0, 32);
    //
    let deviceNum = deviceDataPackageVal.substring(32, 40);
    //
    let subDeviceNum = deviceDataPackageVal.substring(40, 48);
    //
    let protocolType = deviceDataPackageVal.substring(48, 52);
    //
    let deviceType = deviceDataPackageVal.substring(52, 56);
    //
    let length = deviceDataPackageVal.substring(56, 60);
    //
    let mainFrame = deviceDataPackageVal.substring(60, 64);
    //
    let randomCode = deviceDataPackageVal.substring(64, 72);
    // 下面是数据
    // let countCrd = deviceDataPackageVal.substring(72, 76)
    // 帖类型(1字节;00即实用水(ID卡用水、账号+密码用水);01预约用水)+
    let frameType = deviceDataPackageVal.substring(72, 74);
    // 帐号(4字节账号)+ 00000440
    let userId = deviceDataPackageVal.substring(74, 82);
    // 卡号(4字节账号)+
    let cardNo = deviceDataPackageVal.substring(82, 90);
    // 卡序号(1字节)+
    let cardSeq = deviceDataPackageVal.substring(90, 92);
    // 扣费模式(1字节)+
    let chargingMode = deviceDataPackageVal.substring(92, 94);
    // 费率(4字节,时间模式分/秒,流量模式分/脉冲)+
    let chargingRate = deviceDataPackageVal.substring(94, 102);
    // 卡计数器(2两字节)+
    let cardOpCount = deviceDataPackageVal.substring(102, 106);
    // 大钱包余额(4四字节)+
    let cardOddFare = deviceDataPackageVal.substring(106, 114);
    // 补助计数器(2两字节)+
    let cardSubOpCount = deviceDataPackageVal.substring(114, 118);
    // 补助钱包余额(4四字节)+
    let cardSubOddFare = deviceDataPackageVal.substring(118, 126);
    // 使用金额(2两字节)+
    let opFare = deviceDataPackageVal.substring(126, 130);
    // 水龙头索引(2两字节,第一字节水龙头索引、第二字节水龙头索引补码)+
    let waterIndex = deviceDataPackageVal.substring(130, 134);
    // 卡状态(1字节 0 正常卡 1挂失卡 2卡不存在)+
    let cardIdStatus = deviceDataPackageVal.substring(134, 136);
    // 学工号(20字节 4字节的账号,4字节的卡号其他补0)+
    let studentNo = deviceDataPackageVal.substring(136, 176);
    // CRC校验(2字节CRC校验(对账号进行校验),高字节在前)+
    let studentCrc = deviceDataPackageVal.substring(176, 180);
    // 用水量(4四字节)+
    let waterTakeCount = deviceDataPackageVal.substring(180, 188);
    // 用水时间(4四字节)+
    let waterTakeTime = deviceDataPackageVal.substring(188, 196);
    // 用户编号(15字节,无用字节写0)+
    let userNo = deviceDataPackageVal.substring(196, 226);
    // 用户密码(6字节)+
    let userPwd = deviceDataPackageVal.substring(226, 238);
    // 预约用水时间段(4字节的开始时间)+
    let reserveTimePeriodBegin = deviceDataPackageVal.substring(238, 246);
    // 预约用水时间段(4字节的结束时间)+
    let reserveTimePeriodEnd = deviceDataPackageVal.substring(246, 254);
    // 预约后失效时间(2字节)+
    let reserveInvalidTime = deviceDataPackageVal.substring(254, 258);
    // 水温控制(2字节)+
    let waterTempControl = deviceDataPackageVal.substring(258, 262);
    // 时间戳(4字节)+
    let timeStamp = deviceDataPackageVal.substring(262, 270);
    // 姓名(10字节,高字节在前)+
    let userName = deviceDataPackageVal.substring(270, 290);
    // CRC 2字节
    let crc = deviceDataPackageVal.substring(290, 294);
    analysisContext.empty();
    analysisContext.append('<h6>原码:</h6>');
    analysisContext.append('<h6 style="word-wrap: break-word">' + deviceDataPackageVal + '</h6>');
    analysisContext.append('<h6>序列号：' + deviceSn + '  十进：' + parseInt(deviceSn, 16) + '</h6>');
    analysisContext.append('<h6>设备号：' + deviceNum + '  十进：' + parseInt(deviceNum, 16) + '</h6>');
    analysisContext.append('<h6>从设备号：' + subDeviceNum + '  十进：' + parseInt(subDeviceNum, 16) + '</h6>');
    analysisContext.append('<h6>协议类型：' + protocolType + '  十进：' + parseInt(protocolType, 16) + '</h6>');
    analysisContext.append('<h6>设备类型：' + deviceType + '  十进：' + parseInt(deviceType, 16) + '</h6>');
    analysisContext.append('<h6>数据长度：' + length + '  十进：' + parseInt(length, 16) + '</h6>');
    analysisContext.append('<h6>关键帧：' + mainFrame + '  十进：' + parseInt(mainFrame, 16) + '</h6>');
    analysisContext.append('<h6>随机码：' + randomCode + '  十进：' + parseInt(randomCode, 16) + '</h6>');
    analysisContext.append('<h6><strong>--------------------------------------------------------------------</strong></h6>');
    // 下面为数据部分
    // // 帖类型(1字节;00即实用水(ID卡用水、账号+密码用水);01预约用水)+
    // let frameType = deviceDataPackageVal.substring(72, 74);
    analysisContext.append('<h6>帖类型(1字节;00即实用水(ID卡用水、账号+密码用水);01预约用水)：' + frameType + '  十进：' + parseInt(frameType, 16) + '</h6>');
    // // 帐号(4字节账号)+ 00000440
    // let userId = deviceDataPackageVal.substring(74, 82);
    analysisContext.append('<h6>帐号(4字节账号)：' + userId + '  十进：' + parseInt(userId, 16) + '</h6>');
    // // 卡号(4字节账号)+
    // let cardNo = deviceDataPackageVal.substring(82, 90);
    analysisContext.append('<h6>卡号(4字节账号)：' + cardNo + '  十进：' + parseInt(cardNo, 16) + '</h6>');
    // // 卡序号(1字节)+
    // let cardSeq = deviceDataPackageVal.substring(90, 92);
    analysisContext.append('<h6>卡序号(1字节)：' + cardSeq + '  十进：' + parseInt(cardSeq, 16) + '</h6>');
    // // 扣费模式(1字节)+
    // let chargingMode = deviceDataPackageVal.substring(92, 94);
    analysisContext.append('<h6>扣费模式(1字节)：' + chargingMode + '  十进：' + parseInt(chargingMode, 16) + '</h6>');
    // // 费率(4字节,时间模式分/秒,流量模式分/脉冲)+
    // let chargingRate = deviceDataPackageVal.substring(94, 102);
    analysisContext.append('<h6>费率(4字节,时间模式分/秒,流量模式分/脉冲)：' + chargingRate + '  十进：' + parseInt(chargingRate, 16) + '</h6>');
    // // 卡计数器(2两字节)+
    // let cardOpCount = deviceDataPackageVal.substring(102, 106);
    analysisContext.append('<h6>卡计数器(2两字节)：' + cardOpCount + '  十进：' + parseInt(cardOpCount, 16) + '</h6>');
    // // 大钱包余额(4四字节)+
    // let cardOddFare = deviceDataPackageVal.substring(106, 114);
    analysisContext.append('<h6>大钱包余额(4四字节)：' + cardOddFare + '  十进：' + parseInt(cardOddFare, 16) + '</h6>');
    // // 补助计数器(2两字节)+
    // let cardSubOpCount = deviceDataPackageVal.substring(114, 118);
    analysisContext.append('<h6>补助计数器(2两字节)：' + cardSubOpCount + '  十进：' + parseInt(cardSubOpCount, 16) + '</h6>');
    // // 补助钱包余额(4四字节)+
    // let cardSubOddFare = deviceDataPackageVal.substring(118, 126);
    analysisContext.append('<h6>补助钱包余额(4四字节)：' + cardSubOddFare + '  十进：' + parseInt(cardSubOddFare, 16) + '</h6>');
    // // 使用金额(2两字节)+
    // let opFare = deviceDataPackageVal.substring(126, 130);
    analysisContext.append('<h6>使用金额(2两字节)：' + opFare + '  十进：' + parseInt(opFare, 16) + '</h6>');
    // // 水龙头索引(2两字节,第一字节水龙头索引、第二字节水龙头索引补码)+
    // let waterIndex = deviceDataPackageVal.substring(130, 134);
    analysisContext.append('<h6>水龙头索引(2两字节,第一字节水龙头索引、第二字节水龙头索引补码)：' + waterIndex + '  十进：' + parseInt(waterIndex, 16) + '</h6>');
    // // 卡状态(1字节 0 正常卡 1挂失卡 2卡不存在)+
    // let cardIdStatus = deviceDataPackageVal.substring(134, 136);
    analysisContext.append('<h6>卡状态(1字节 0 正常卡 1挂失卡 2卡不存在)：' + cardIdStatus + '  十进：' + parseInt(cardIdStatus, 16) + '</h6>');
    // // 学工号(20字节 4字节的账号,4字节的卡号其他补0)+
    // let studentNo = deviceDataPackageVal.substring(136, 176);
    analysisContext.append('<h6>学工号(20字节 4字节的账号,4字节的卡号其他补0)：' + studentNo + '  十进：' + parseInt(studentNo, 16) + '</h6>');
    // // CRC校验(2字节CRC校验(对账号进行校验),高字节在前)+
    // let studentCrc = deviceDataPackageVal.substring(176, 180);
    analysisContext.append('<h6>CRC校验(2字节CRC校验(对账号进行校验),高字节在前)：' + studentCrc + '  十进：' + parseInt(studentCrc, 16) + '</h6>');
    // // 用水量(4四字节)+
    // let waterTakeCount = deviceDataPackageVal.substring(180, 188);
    analysisContext.append('<h6>用水量(4四字节)：' + waterTakeCount + '  十进：' + parseInt(waterTakeCount, 16) + '</h6>');
    // // 用水时间(4四字节)+
    // let waterTakeTime = deviceDataPackageVal.substring(188, 196);
    analysisContext.append('<h6>用水时间(4四字节)：' + waterTakeTime + '  十进：' + parseInt(waterTakeTime, 16) + '</h6>');
    // // 用户编号(15字节,无用字节写0)+
    // let userNo = deviceDataPackageVal.substring(196, 226);
    analysisContext.append('<h6>用户编号(15字节,无用字节写0)：' + userNo + '  十进：' + parseInt(userNo, 16) + '</h6>');
    // // 用户密码(6字节)+
    // let userPwd = deviceDataPackageVal.substring(226, 238);
    analysisContext.append('<h6>用户密码(6字节)：' + userPwd + '  十进：' + parseInt(userPwd, 16) + '</h6>');
    // 预约用水时间段(4字节的开始时间)+
    // let reserveTimePeriodBegin = deviceDataPackageVal.substring(238, 246);
    analysisContext.append('<h6>预约用水时间段(4字节的开始时间)：' + reserveTimePeriodBegin + '  十进：' + parseInt(reserveTimePeriodBegin, 16) + '</h6>');
    // 预约用水时间段(4字节的结束时间)+
    // let reserveTimePeriodEnd = deviceDataPackageVal.substring(246, 254);
    analysisContext.append('<h6>预约用水时间段(4字节的结束时间)：' + reserveTimePeriodEnd + '  十进：' + parseInt(reserveTimePeriodEnd, 16) + '</h6>');
    // // 预约后失效时间(2字节)+
    // let reserveInvalidTime = deviceDataPackageVal.substring(246, 250);
    analysisContext.append('<h6>预约后失效时间(2字节)：' + reserveInvalidTime + '  十进：' + parseInt(reserveInvalidTime, 16) + '</h6>');
    // // 水温控制(2字节)+
    // let waterTempControl = deviceDataPackageVal.substring(250, 254);
    analysisContext.append('<h6>水温控制(2字节)：' + waterTempControl + '  十进：' + parseInt(waterTempControl, 16) + '</h6>');
    // // 时间戳(4字节)+
    // let timeStamp = deviceDataPackageVal.substring(254, 262);
    analysisContext.append('<h6>时间戳(4字节)：' + timeStamp + '  十进：' + parseInt(timeStamp, 16) + '</h6>');
    // // 姓名(10字节,高字节在前)+
    // let userName = deviceDataPackageVal.substring(262, 282);
    analysisContext.append('<h6>姓名(10字节,高字节在前)：' + userName + '  十进：' + parseInt(userName, 16) + '</h6>');
    // 校验
    analysisContext.append('<h6><strong>--------------------------------------------------------------------</strong></h6>');
    analysisContext.append('<h6>校验：' + crc + '  十进：' + parseInt(crc, 16) + '</h6>');
  }
</script>
</body>
</html>
